package fiuba.algo3.tp2;

import java.util.Random;

public class Partida {
	
	private Mapa mapa;
	//private Catastrofe catastrofe;

	public Partida() {

		this.mapa = mapa.getInstance();
	}
	
	public Mapa getMapa() {
		return mapa;

	}	
	
	//public void agregarCatastrofe(Catastrofe catastrofe) {
	//	this.catastrofe = catastrofe;
	//	this.seIniciaCatastrofe();
	//}
	
	public void recorrerMapa(){
		
		Mapa mapa = Mapa.getInstance();
		int inicioZonaI = -2;
		for (int limiteZonaI = 2; limiteZonaI <mapa.devolverTamanio(); limiteZonaI += 2) {
			int inicioZonaJ = -2;
			inicioZonaI += 2;
			for (int limiteZonaJ = 2; limiteZonaJ < mapa.devolverTamanio(); limiteZonaJ += 2) {
				inicioZonaJ += 2;
												
				ZonaTemporal zonaTemporal = new ZonaTemporal();
				
				for (int i = inicioZonaI; i < limiteZonaI; i++) {
					for (int j = inicioZonaJ; j < limiteZonaJ; j++) {
						
						Hectarea hectarea = mapa.coordenada(i, j);
						if (hectarea.tieneUnEdificable()) {
							if ((hectarea.obtenerEdificable().getEstado())<100){
								Coordenada coordenada = new Coordenada(i,j);
								mapa.agregarEdificableHaReparar(coordenada);
							}	
							zonaTemporal = hectarea.obtenerEdificable().pasarTurno(zonaTemporal);
						}	
					}
				}
				
				int inquilinosPartidaActual = 0;
				int cantidadInquilinosComercio=0;
				int impuestosACobrar=0;
				String situacionCrecimiento = "";

				if ((zonaTemporal.getUltimaResidencia() != null) && (zonaTemporal.getCantComercios() > 0) ) {
					cantidadInquilinosComercio = zonaTemporal.getInquilinos() / (zonaTemporal.getCantComercios());

					if ((zonaTemporal.getInquilinos() < zonaTemporal.getEmpleabilidad()) && (cantidadInquilinosComercio < Constantes.INDICECOMERCIOACEPTADO)) {
						zonaTemporal.getUltimaResidencia().crecer();
						situacionCrecimiento = "Zona en Crecimiento";
						inquilinosPartidaActual = zonaTemporal.getInquilinos()  +5;
					}

					else if ((zonaTemporal.getInquilinos()  > zonaTemporal.getEmpleabilidad()) && (cantidadInquilinosComercio > Constantes.INDICECOMERCIOACEPTADO)) {
						zonaTemporal.getUltimaResidencia().decrecer();
						situacionCrecimiento = "Zona en Decrecimiento";
						inquilinosPartidaActual = zonaTemporal.getInquilinos()  -5;
					}
					
				}
				impuestosACobrar = inquilinosPartidaActual*Constantes.IMPUESTO;
				Zona zona = new Zona(zonaTemporal.getCantResidencias(), zonaTemporal.getCantIndustrias(), zonaTemporal.getCantComercios(), zonaTemporal.getInquilinos(),
						zonaTemporal.getEmpleabilidad(), cantidadInquilinosComercio, situacionCrecimiento, inquilinosPartidaActual, impuestosACobrar); 
				mapa.agregarZona(zona);		
			}
		}
	}
	

	public void imprimirEstadoMapa() {
		
		for(int i = 0; i<mapa.getZonas().size();i++){
			Zona zona = mapa.getZonas().get(i);
			System.out.println("");
			System.out.println("");
			System.out.println("ZONA: "+ i);
			System.out.println("");
			System.out.println("Cantidad de Residencias: " +zona.getCantResidencias());
			System.out.println("");
			System.out.println("Cantidad de Inquilinos: " +zona.getInquilinos());
			System.out.println("");
			System.out.println("Cantidad de Industrias: " +zona.getCantIndustrias());
			System.out.println("");
			System.out.println("Empleabilidad: " +zona.getEmpleabilidad());
			System.out.println("");
			System.out.println("Cantidad de Comercios: " +zona.getCantComercios());
			System.out.println("");
			System.out.println("Cantidad de Habitantes por Comercio: " +zona.getCantInquilinosPorComercio());
			System.out.println("");
			System.out.println("Situacion de Crecimiento: " +zona.getSituacionCrecimiento());
			System.out.println("");
			System.out.println("Actualizacion Inquilinos: " +zona.getInquilinosPartidaActual());
			System.out.println("");
			System.out.println("Impuestos: " +zona.getImpuestosACobrar());
			System.out.println("");
			System.out.println("");

		}
	}
		
	public void imprimirHectareasHaReparar() {
			
		System.out.println("");
		System.out.println("EDIFICIOS HA REPARAR");
		System.out.println("");
		
		for(int i = 0; i<mapa.getEdificablesHaReparar().size();i++){
			Coordenada coordenada = mapa.getEdificablesHaReparar().get(i);
				System.out.println("Hectarea ha reparar: "+ i);
				System.out.println("");
				System.out.println("Coordenada i: "+coordenada.obtenerFila());
				System.out.println("");
				System.out.println("Coordenada j: "+coordenada.obtenerColumna());
				System.out.println("");

			}
		
		}
	
	////////////////////////////// CATASTROFE////////////////////////////
	
	public void seIniciaCatastrofe() {
				
		int numRandomParaSaberTipoCatastrofe = crearNumeroRandomEntreMinYMaxInclusive (1, 2);
		//numRandomParaSaberTipoCatastrofe = 2; //HARCKODEO PARA TEST
		if (numRandomParaSaberTipoCatastrofe == 1){ //Terremoto
			int coordenadaFiladeInicioCatastrofe = crearNumeroRandomEntreMinYMaxInclusive (0, mapa.devolverTamanio());
			int coordenadaColumnaInicioCatastrofe = crearNumeroRandomEntreMinYMaxInclusive (0, mapa.devolverTamanio());
			Coordenada coordenadaDeOrigenDeCatastrofe = new Coordenada (coordenadaFiladeInicioCatastrofe, coordenadaColumnaInicioCatastrofe);
			//coordenadaDeOrigenDeCatastrofe = new Coordenada(4, 4); //HARCKODEO PARA TEST
			
			Catastrofe catastrofe = new Terremoto(coordenadaDeOrigenDeCatastrofe);
			catastrofe.iniciarCatastrofe();
			
		} else { //Godzilla
			Coordenada coordenadaDeOrigenDeCatastrofe = crearCoordenadaInicioGodzilla();
			Catastrofe catastrofe = new Godzilla(coordenadaDeOrigenDeCatastrofe);
			catastrofe.iniciarCatastrofe();
		}
	}
	
	private Coordenada crearCoordenadaInicioGodzilla() {
		
		Coordenada coordenadaADevolver = new Coordenada(1,1);
		
		while (   coordenadaADevolver.obtenerFila() != 0 
				& coordenadaADevolver.obtenerColumna() != 0 
				& coordenadaADevolver.obtenerFila() != (this.mapa.devolverTamanio()-1)
				& coordenadaADevolver.obtenerColumna() != (this.mapa.devolverTamanio()-1))
				{
			int filaRandom = crearNumeroRandomEntreMinYMaxInclusive(0, this.mapa.devolverTamanio()-1);
			int columnaRandom = crearNumeroRandomEntreMinYMaxInclusive(0, this.mapa.devolverTamanio()-1);
			coordenadaADevolver.setFila(filaRandom);
			coordenadaADevolver.setColumna(columnaRandom);
			//Para testear que salga desde un borde
			//System.out.println(coordenadaADevolver.devolverCoordenadaEnString());
		}
		//coordenadaADevolver = new Coordenada (3,0); //HARCKODEO PARA TEST
		return coordenadaADevolver;
	}

	public int crearNumeroRandomEntreMinYMaxInclusive(int min, int max){
		Random random = new Random();
		int numeroRandomADevolver = random.nextInt(max - min + 1) + min;
		return numeroRandomADevolver;
	}
}


